[Node.js]node.jsからゆっくりボイスをしゃべらせる[ネタ]
node.jsからゆっくりボイスをしゃべらせる
ゆっくりボイスといえば、ニコニコとかでよく聞くあれです。 Windowsの場合、softalkを使えば再生したりファイルに保存したりできます。 Macでゆっくりボイスを使いたい場合、Yukkuroidというアプリがあります。 これはMacでゆっくりボイスをしゃべらせるためのアプリなのですが、外部からアクセスするためのAPIも公開しています。 今回はこのアプリのAPIに、以前紹介したNodObjCを使用して、 アクセスしてみましょう。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.4
- Node.js : v0.8.1
- Yukkuroid : v0.4.1
適当なディレクトリを作成し、そこでnpmを使用してNodObjCをインストールします。
% mkdir yukkuri % cd yukkuri % npm install NodObjC
また、Node.jsからアクセスする際、Yukkuroidが起動している必要があるので、ここからダウンロード、 インストールし、起動しておいてください。
ゆっくりAPIにアクセスするモジュールを作成
yukkuri.jsという名前で、ゆっくりAPIにアクセスするためのモジュールを作成します。 やっていることは単純で、Objective-Cのプロセス間通信を使用して、公開されているAPIにアクセスしているだけです。
var $ = require('NodObjC'); $.import('Foundation'); $.import('Cocoa'); var processName, host, proxy, pool; /** * 初期化処理. * ここで自動解放プールの作成と必要なNSStringの作成. */ exports.init = function() { pool = $.NSAutoreleasePool('alloc')('init'); processName = $.NSString('stringWithUTF8String', 'com.yukkuroid.rpc'); host = $.NSString('stringWithUTF8String', ''); proxy = $.NSConnection('rootProxyForConnectionWithRegisteredName',processName,'host',host); }; /** * 終了処理.リソースを解放する. */ exports.release = function() { pool('drain'); }; /** * NSConnectionを取得する. */ exports.getProxy = function() { return proxy; }; /** * 通常テキスト欄に値をセット. */ exports.setKanjiText = function(jsStr) { var objCStr = $.NSString('stringWithUTF8String', jsStr); proxy('setKanjiText',objCStr); }; exports.getKanjiText = function() { return proxy('getKanjiText'); }; /** * 音声を再生する. */ exports.play = function() { proxy('pushPlayButton',0); };
今回は初期化とか再生とか、いくつかのAPIしか使ってません。実際は、しゃべる速度とか音量とか、いろいろできます。
ゆっくりモジュールを使う
ではyukkuri.jsを使ってみましょう。app.jsという名前でファイルを作成します。 yukkuri.jsをrequireし、コマンドライン引数からしゃべらせたい文字を取得、再生しましょう。
//app.js var yukkuri = require('./yukkuri');
var word;
if (process.argv.length <= 2) { console.log("引数にしゃべらせたい文字を指定してください"); process.exit(0); } //初期化 yukkuri.init(); //引数から文字を取得してセット yukkuri.setKanjiText(process.argv[2]); var text = yukkuri.getKanjiText(); console.log("しゃべる文字:",text); //再生 yukkuri.play(); //後処理 yukkuri.release(); [/javascript]
実行!
コンソールから実行してみましょう。 ゆっくりボイスでしゃべります。 ※Yukkuroidは起動しておいてください
% node app.js ゆっくりしていってね
まとめ
いかがでしょう。Node.jsからNodObjCのプロセス間通信をつかってAPIにアクセスすることができました。 なお、YukkuroidとかsoftalkがベースとしているAquesTalkを使えば、もっといろんな使い方ができるとおもいます。